Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   138 obs. of  13 variables:
 $ tmc            : chr  "118P15109" "118P15110" "118P15111" "118N15109" ...
 $ country        : chr  "USA" "USA" "USA" "USA" ...
 $ state          : chr  "Minnesota" "Minnesota" "Minnesota" "Minnesota" ...
 $ county         : chr  "Scott" "Scott" "Scott" "Scott" ...
 $ distance       : num  1.402 0.838 0.676 1.112 0.528 ...
 $ road_number    : chr  "CR-18" "CR-18" "CR-18" "CR-18" ...
 $ road_name      : chr  NA NA NA NA ...
 $ latitude       : num  44.8 44.8 44.8 44.8 44.8 ...
 $ longitude      : num  -93.4 -93.4 -93.4 -93.4 -93.4 ...
 $ direction      : chr  "Northbound" "Northbound" "Northbound" "Southbound" ...
 $ sequence       : num  1 2 3 3 2 1 24 25 26 27 ...
 $ free_flow_tt   : num  99 99 50 112 13 20 3 116 257 130 ...
 $ free_flow_speed: num  51 30.5 48.7 35.7 146.2 ...
NULL

We combine all of the downloaded trip data for the area from the TTRMS.exe tool.

 [1] "CR-42_Eastbound_118N15512_to_118N15511.csv"  
 [2] "CR-42_Westbound_118P05284_to_118P05285.csv"  
 [3] "MN-13_Northbound_118P05351_to_118P05352.csv" 
 [4] "MN-41_Northbound_118P05380_to_118P05381.csv" 
 [5] "MN-41_Southbound_118N05381_to_118N05380.csv" 
 [6] "US-169_Northbound_118P05065_to_118P05066.csv"
 [7] "US-169_Northbound_118P05069_to_118P05070.csv"
 [8] "US-169_Northbound_118P05070_to_118P05071.csv"
 [9] "US-169_Southbound_118N04465_to_118N04464.csv"
[10] "US-169_Southbound_118N05070_to_118N05069.csv"
[11] "US-169_Southbound_118N05071_to_118N05070.csv"
[12] "US-212_Westbound_118N18737_to_118N18736.csv" 

The total dimensions of the combined dataset is 1893888 rows and 15 columns.

head(TMC_data)
Data contains 5 rows with either missing or invalid lat/lon values and will be ignored

Introduction

We will look at each TMC individually.

TMCs in Scott County

Tab 1

US-169_Southbound_118N04465_to_118N04464

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector

Sparkline

We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

Tab 2

CR-42_Westbound_118P05284_to_118P05285

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
Data contains 2 rows with either missing or invalid lat/lon values and will be ignored

We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

Tab 3

US-169_Northbound_118P05065_to_118P05066

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector

We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

Tab 4

US-169_Southbound_118N05070_to_118N05069

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector



We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

Tab 5

US-169_Southbound_118N05071_to_118N05070

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector



We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

Tab 6

MN-13_Northbound_118P05351_to_118P05352

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector



We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

Tab 7

MN-41_Southbound_118N05381_to_118N05380

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
Data contains 1 rows with either missing or invalid lat/lon values and will be ignored



We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

Tab 8

MN-41_Northbound_118P05380_to_118P05381

Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector



We now treat the average travel time per day as a time series. Below is a plot that isolate out the trend and the seasonality of the data set.

LS0tDQp0aXRsZTogIlRyYXZlbCBUaW1lcyBhcm91bmQgUmVuYWlzc2FtY2UgRmVzdGl2YWwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQogIA0KYGBge3IsZWNobz1GQUxTRSxpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShmb3JlY2FzdCkNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHJDaGFydHMpDQpsaWJyYXJ5KERUKQ0Kb3B0aW9ucyhrbml0ci50YWJsZS5mb3JtYXQgPSAiaHRtbCIpIA0KYGBgDQoNCmBgYHtyICdzZXR1cCcsaW5jbHVkZT1GQUxTRX0NCnJlcXVpcmUoa25pdHIpDQpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gIkg6L1Byb2plY3RzLzExMDAwLzExMTg3L1RTL1Rhc2sgMiIpDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KVE1DX2FsbCA8LSByZWFkeGw6OnJlYWRfeGxzeCgiVE1DX0FsbC54bHN4IikNClRNQ19hbGwgPC0gVE1DX2FsbFshaXMubmEoVE1DX2FsbCRkaXN0YW5jZSksXQ0KcHJpbnQoc3RyKFRNQ19hbGwpKQ0KDQpgYGANCg0KV2UgY29tYmluZSBhbGwgb2YgdGhlIGRvd25sb2FkZWQgdHJpcCBkYXRhIGZvciB0aGUgYXJlYSBmcm9tIHRoZSBUVFJNUy5leGUgdG9vbC4NCmBgYHtyLHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRX0NCg0KbGlzdF9jc3YgPC0gbGlzdC5maWxlcyhwYXR0ZXJuID0gIiouY3N2IikNCm15ZmlsZXMgPC0gbGFwcGx5KGxpc3RfY3N2LHJlYWQuY3N2KQ0KZmlsZXMgPC0gbWFwcGx5KGNiaW5kLG15ZmlsZXMsJ2ZpbGVuYW1lJyA9IGxpc3RfY3N2LFNJTVBMSUZZID0gRikNClRNQ19kYXRhIDwtIHJiaW5kX2xpc3QoZmlsZXMpDQpsaXN0X2Nzdg0KYGBgDQoNClRoZSB0b3RhbCBkaW1lbnNpb25zIG9mIHRoZSBjb21iaW5lZCBkYXRhc2V0IGlzIGByIHBhc3RlKGRpbShUTUNfZGF0YSlbMV0sJ3Jvd3MgYW5kJyxkaW0oVE1DX2RhdGEpWzJdLCdjb2x1bW5zJylgLg0KDQpgYGB7cn0NCmhlYWQoVE1DX2RhdGEpDQpgYGANCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNClRNQ19kYXRhICU8PiUgDQogIG11dGF0ZShUcmF2ZWwuVGltZS4ubWludXRlcy4gPSBhcy5udW1lcmljKFRyYXZlbC5UaW1lLi5taW51dGVzLiksDQogICAgICAgICBsdWJyaWRhdGUgPWFzLlBPU0lYY3QoVE1DX2RhdGEkVGltZXN0YW1wLGZvcm1hdCA9ICIlWS0lbS0lZCAlSDolTTolUyIpKQ0KVE1DX2RhdGEgJTw+JSANCiAgbXV0YXRlKGhvdXIgPSBhcy5mYWN0b3IoaG91cihUTUNfZGF0YSRsdWJyaWRhdGUpKSwNCiAgICAgICAgIG1vbnRoID0gYXMuZmFjdG9yKG1vbnRoKFRNQ19kYXRhJGx1YnJpZGF0ZSkpLA0KICAgICAgICAgeWVhciA9IGFzLmZhY3Rvcih5ZWFyKFRNQ19kYXRhJGx1YnJpZGF0ZSkpLA0KICAgICAgICAgd2Vla2RheSA9IGZhY3Rvcih3ZWVrZGF5cyhUTUNfZGF0YSRsdWJyaWRhdGUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJNb25kYXkiLCJUdWVzZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmlkYXkiLCJTYXR1cmRheSIsIlN1bmRheSIpKSwNCiAgICAgICAgIGRheSA9IGFzLmZhY3RvcihkYXkoVE1DX2RhdGEkbHVicmlkYXRlKSksDQogICAgICAgICBmaWxlbmFtZV9zcGxpdCA9IGZpbGVuYW1lKSANCg0KVE1DX2RhdGEgJTw+JSANCiAgc2VwYXJhdGUoZmlsZW5hbWVfc3BsaXQsaW50byA9IGMoJ1JvdXRlJywnRGlyZWN0aW9uJywnRnJvbScsJ05BJywnVG8nKSxzZXA9J18nKQ0KVE1DX2RhdGEkVG8gPC0gc3ViKCIuY3N2IiwnJyxUTUNfZGF0YSRUbykNCg0KVE1DX2RhdGFfbWVyZ2UgPC0gbWVyZ2UoVE1DX2RhdGEsVE1DX2FsbFssYygndG1jJywnbGF0aXR1ZGUnLCdsb25naXR1ZGUnKV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgYnkueCA9ICdGcm9tJyxieS55PSd0bWMnLGFsbC54PVRSVUUpDQpjb2xuYW1lcyhUTUNfZGF0YV9tZXJnZSlbd2hpY2gobmFtZXMoVE1DX2RhdGFfbWVyZ2UpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVpbiUgYygnbGF0aXR1ZGUnLCdsb25naXR1ZGUnKSldIDwtIGMoJ2Zyb21fbGF0aXR1ZGUnLCdmcm9tX2xvbmdpdHVkZScpDQoNClRNQ19kYXRhX21lcmdlIDwtIG1lcmdlKFRNQ19kYXRhX21lcmdlLFRNQ19hbGxbLGMoJ3RtYycsJ2xhdGl0dWRlJywnbG9uZ2l0dWRlJyldLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5LnggPSAnVG8nLGJ5Lnk9J3RtYycsYWxsLng9VFJVRSkNCmNvbG5hbWVzKFRNQ19kYXRhX21lcmdlKVt3aGljaChuYW1lcyhUTUNfZGF0YV9tZXJnZSkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWluJSBjKCdsYXRpdHVkZScsJ2xvbmdpdHVkZScpKV0gPC0gYygndG9fbGF0aXR1ZGUnLCd0b19sb25naXR1ZGUnKQ0KDQoNClRNQ19VbmlxdWUgPC0gVE1DX2RhdGFfbWVyZ2VbIWR1cGxpY2F0ZWQoVE1DX2RhdGFfbWVyZ2UkVG8pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCdUbycsJ0Zyb20nLCJmcm9tX2xhdGl0dWRlIiwiZnJvbV9sb25naXR1ZGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b19sYXRpdHVkZSIsInRvX2xvbmdpdHVkZSIsIkRpcmVjdGlvbiIpXQ0KDQpUTUNfR1BTMSA8LSBtZWx0KFRNQ19VbmlxdWUsbWVhc3VyZS52YXJzPWMoJ0Zyb20nKSwNCiAgICAgICAgICAgICAgICAgaWQudmFycz1jKCdmcm9tX2xhdGl0dWRlJywnZnJvbV9sb25naXR1ZGUnKSwNCiAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KVE1DX0dQUzIgPC0gbWVsdChUTUNfVW5pcXVlLG1lYXN1cmUudmFycz1jKCdUbycpLA0KICAgICAgICAgICAgICAgICBpZC52YXJzPWMoJ3RvX2xhdGl0dWRlJywndG9fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAnVE1DJykNCg0KY29sbmFtZXMoVE1DX0dQUzEpIDwtIGMoJ0xhdCcsJ0xvbmcnLCdWYXJpYWJsZScsJ1RNQycpDQpjb2xuYW1lcyhUTUNfR1BTMikgPC0gYygnTGF0JywnTG9uZycsJ1ZhcmlhYmxlJywnVE1DJykNClRNQ19HUFMgPC0gYmluZF9yb3dzKFRNQ19HUFMxLFRNQ19HUFMyKQ0KVE1DX0dQUyRsYWJlbCA8LSBwYXN0ZShUTUNfR1BTJFZhcmlhYmxlLCc6JyxUTUNfR1BTJFRNQyxzZXAgPSAnJykgDQpgYGANCg0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9NX0NClRyYWZmaWNfY2FtZXJhIDwtIG1ha2VJY29uKCdUcmFmZmljX2NhbWVyYS5wbmcnLGljb25XaWR0aCA9IDI0LCBpY29uSGVpZ2h0ID0gMjApDQoNCmxlYWZsZXQoZGF0YT1UTUNfR1BTLHdpZHRoID0gJzEwMCUnKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtOTMuNTUwODI1LCBsYXQgPSAgNDQuNzIxNjE0LCB6b29tID0gMTEpJT4lDQogIGFkZFRpbGVzKCkgJT4lIA0KICBhZGRNYXJrZXJzKH5Mb25nLH5MYXQsaWNvbj1UcmFmZmljX2NhbWVyYSxsYWJlbCA9IH5UTUMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKQ0KDQpgYGANCg0KDQoNCiMjIEludHJvZHVjdGlvbiA8YSBuYW1lPSJpbnRyb2R1Y3Rpb24iPjwvYT4NCg0KV2Ugd2lsbCBsb29rIGF0IGVhY2ggVE1DIGluZGl2aWR1YWxseS4NCg0KIyMgVE1DcyBpbiBTY290dCBDb3VudHkgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQojIyMgVGFiIDENCg0KIyMjIyBVUy0xNjlfU291dGhib3VuZF8xMThOMDQ0NjVfdG9fMTE4TjA0NDY0IA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbXlfcGxvdC5kZWNvbXBvc2VkLnRzID0gZnVuY3Rpb24oeCwgdGl0bGU9IiIsIC4uLikgew0KICB4eCA8LSB4JHgNCiAgaWYgKGlzLm51bGwoeHgpKSANCiAgICB4eCA8LSB3aXRoKHgsIGlmICh0eXBlID09ICJhZGRpdGl2ZSIpIA0KICAgICAgcmFuZG9tICsgdHJlbmQgKyBzZWFzb25hbA0KICAgICAgZWxzZSByYW5kb20gKiB0cmVuZCAqIHNlYXNvbmFsKQ0KICBwbG90KGNiaW5kKG9ic2VydmVkID0geHgsIHRyZW5kID0geCR0cmVuZCwgc2Vhc29uYWwgPSB4JHNlYXNvbmFsLCByYW5kb20gPSB4JHJhbmRvbSksIA0KICAgICAgIG1haW49dGl0bGUsIC4uLikNCn0NCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZ3M9RkFMU0V9DQpkYXQgPC0gVE1DX2RhdGFfbWVyZ2UgJT4lDQogIGZpbHRlcihmaWxlbmFtZSA9PSBwYXN0ZSgnVVMtMTY5X1NvdXRoYm91bmRfMTE4TjA0NDY1X3RvXzExOE4wNDQ2NCcsJy5jc3YnLHNlcD0nJykpDQoNCmRhdF9HUFMxIDwtIG1lbHQoZGF0WzEsXSxtZWFzdXJlLnZhcnM9YygnRnJvbScpLA0KICAgICAgICAgICAgICAgIGlkLnZhcnM9YygnZnJvbV9sYXRpdHVkZScsJ2Zyb21fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KZGF0X0dQUzIgPC0gbWVsdChkYXRbMSxdLG1lYXN1cmUudmFycz1jKCdUbycpLA0KICAgICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCd0b19sYXRpdHVkZScsJ3RvX2xvbmdpdHVkZScpLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KDQpjb2xuYW1lcyhkYXRfR1BTMSkgPC0gYygnTGF0JywnTG9uZycsJ1ZhcmlhYmxlJywnVE1DJykNCmNvbG5hbWVzKGRhdF9HUFMyKSA8LSBjKCdMYXQnLCdMb25nJywnVmFyaWFibGUnLCdUTUMnKQ0KZGF0X0dQUyA8LSBiaW5kX3Jvd3MoZGF0X0dQUzEsZGF0X0dQUzIpDQpkYXRfR1BTJGxhYmVsIDwtIHBhc3RlKGRhdF9HUFMkVmFyaWFibGUsJzonLGRhdF9HUFMkVE1DLHNlcCA9ICcnKQ0KYGBgDQoNCg0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTJ9DQogDQpsZWFmbGV0KGRhdGE9ZGF0X0dQUyx3aWR0aCA9ICcxMDAlJykgJT4lDQogIHNldFZpZXcobG5nID0gLTkzLjQ2MjI3MSwgbGF0ID0gIDQ0Ljc4MzgxMSwgem9vbSA9IDExKSU+JQ0KICBhZGRUaWxlcygpICU+JSANCiAgYWRkTWFya2Vycyh+TG9uZyx+TGF0LGljb249VHJhZmZpY19jYW1lcmEsbGFiZWwgPSB+VE1DKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkT3BlblN0cmVldE1hcCkNCg0KDQpgYGANCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KTWVhbl9UcmF2ZWwgPC0gZGF0WyFpcy5uYShkYXQkVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSxdICU+JSANCiAgZ3JvdXBfYnkoZGF5PShmbG9vcl9kYXRlKGx1YnJpZGF0ZSwiZGF5IikpKSAlPiUNCiAgc3VtbWFyaXNlKE1lYW49bWVhbigoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNYXg9bWF4KChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1pbj1taW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgU3RkPXNkKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1lZGlhbj1tZWRpYW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpKSAlPiUNCiAgYXJyYW5nZShkYXkpDQpNZWFuX1RyYXZlbCR5ZWFyX2F2ZXJhZ2UgPC0gbWEoTWVhbl9UcmF2ZWwkTWVhbixvcmRlcj0zNjUpDQpkYXRhdGFibGUoTWVhbl9UcmF2ZWwsZmlsdGVyID0gJ3RvcCcsb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aD03KSklPiUgZm9ybWF0Um91bmQoY29sbmFtZXMoTWVhbl9UcmF2ZWxbLDI6N10pLDMpJT4lIGZvcm1hdERhdGUoMSxtZXRob2QgPSAndG9EYXRlU3RyaW5nJykNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9MixmaWcud2lkdGg9MTAsd2FybmluZz1GQUxTRX0NCmYgPC0gZ2dwbG90KE1lYW5fVHJhdmVsKSsNCiAgZ2VvbV9saW5lKGFlcyhkYXkseWVhcl9hdmVyYWdlKSxjb2xvcj0ncmVkJykrDQogIGdlb21fbGluZShhZXMoZGF5LE1lYW4pLGxpbmV0eXBlPSJkYXNoZWQiLHNpemU9LjUpKw0KICAjZ2VvbV9saW5lKGFlcyhkYXksTWVkaWFuKSxjb2xvcj0ncmVkJykrDQogIHNjYWxlX3hfZGF0ZXRpbWUoYnJlYWtzID0gZGF0ZV9icmVha3MoIjEgbW9udGgiKSkrDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT02NSwgdmp1c3Q9MC42KSkNCmdncGxvdGx5KGYpDQoNCg0KYGBgDQoNCg0KYGBge3IgcmVzdWx0cyA9ICdhc2lzJywgY29tbWVudCA9IE5BLGVjaG89RkFMU0V9DQoNCnAxNiA9IG5QbG90KHVlbXBtZWQgfiBkYXRlLCBkYXRhID0gZWNvbm9taWNzLCB0eXBlID0gJ3NwYXJrbGluZVBsdXMnLGhlaWdodD0xMDAsd2lkdGg9MTAwMCkNCnAxNiRjaGFydCh4VGlja0Zvcm1hdD0iIyFmdW5jdGlvbihkKSB7cmV0dXJuIGQzLnRpbWUuZm9ybWF0KCclYiAlWScpKG5ldyBEYXRlKCBkICogODY0MDAwMDAgKSk7fSEjIikNCnAxNiRzYXZlKCdGaWd1cmVfMV8xLmh0bWwnLCBzdGFuZGFsb25lID0gVFJVRSkNCg0KYGBgDQoNCjxwIGFsaWduPSJjZW50ZXIiPlNwYXJrbGluZTwvcD4NCg0KPHAgYWxpZ249ICJjZW50ZXIiPjxpZnJhbWUgc3JjID0nRmlndXJlXzFfMS5odG1sJyB3aWR0aCA9ICIxMDAwIiBoZWlnaHQgPSAiMjAwIiBmcmFtZUJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuID48L2lmcmFtZT48L3A+DQoNCg0KDQpXZSBub3cgdHJlYXQgdGhlIGF2ZXJhZ2UgdHJhdmVsIHRpbWUgcGVyIGRheSBhcyBhIHRpbWUgc2VyaWVzLiBCZWxvdyBpcyBhIHBsb3QgdGhhdCBpc29sYXRlIG91dCB0aGUgdHJlbmQgYW5kIHRoZSBzZWFzb25hbGl0eSBvZiB0aGUgZGF0YSBzZXQuIA0KDQoNCg0KYGBge3IsZWNobz1GQUxTRX0NCnRzX1RpbWUgPSB0cyhNZWFuX1RyYXZlbCRNZWFuLCBmcmVxdWVuY3kgPSAzNjUsc3RhcnQgPSBjKDIwMTQpKQ0KZGVjb21wb3NlX1RpbWUgPSBkZWNvbXBvc2UodHNfVGltZSwgImFkZGl0aXZlIikNCg0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkc2Vhc29uYWwpKQ0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkdHJlbmQpKQ0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkcmFuZG9tKSkNCm15X3Bsb3QuZGVjb21wb3NlZC50cyhkZWNvbXBvc2VfVGltZSkNCnRpdGxlKG1haW4gPSAiVVMtMTY5X1NvdXRoYm91bmRfMTE4TjA0NDY1X3RvXzExOE4wNDQ2NFxuIE1lYW4gVHJhdmVsIFRpbWUgU2VyaWVzIEFuYWx5c2lzIikNCmBgYA0KDQoNCiMjIyBUYWIgMg0KDQojIyMjIENSLTQyX1dlc3Rib3VuZF8xMThQMDUyODRfdG9fMTE4UDA1Mjg1DQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZ3M9RkFMU0V9DQpkYXQgPC0gVE1DX2RhdGFfbWVyZ2UgJT4lDQogIGZpbHRlcihmaWxlbmFtZSA9PSBwYXN0ZSgnQ1ItNDJfV2VzdGJvdW5kXzExOFAwNTI4NF90b18xMThQMDUyODUnLCcuY3N2JyxzZXA9JycpKQ0KDQpkYXRfR1BTMSA8LSBtZWx0KGRhdFsxLF0sbWVhc3VyZS52YXJzPWMoJ0Zyb20nKSwNCiAgICAgICAgICAgICAgICBpZC52YXJzPWMoJ2Zyb21fbGF0aXR1ZGUnLCdmcm9tX2xvbmdpdHVkZScpLA0KICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAnVE1DJykNCmRhdF9HUFMyIDwtIG1lbHQoZGF0WzEsXSxtZWFzdXJlLnZhcnM9YygnVG8nKSwNCiAgICAgICAgICAgICAgICAgICAgIGlkLnZhcnM9YygndG9fbGF0aXR1ZGUnLCd0b19sb25naXR1ZGUnKSwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAnVE1DJykNCg0KY29sbmFtZXMoZGF0X0dQUzEpIDwtIGMoJ0xhdCcsJ0xvbmcnLCdWYXJpYWJsZScsJ1RNQycpDQpjb2xuYW1lcyhkYXRfR1BTMikgPC0gYygnTGF0JywnTG9uZycsJ1ZhcmlhYmxlJywnVE1DJykNCmRhdF9HUFMgPC0gYmluZF9yb3dzKGRhdF9HUFMxLGRhdF9HUFMyKQ0KZGF0X0dQUyRsYWJlbCA8LSBwYXN0ZShkYXRfR1BTJFZhcmlhYmxlLCc6JyxkYXRfR1BTJFRNQyxzZXAgPSAnJykNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9NH0NCiANCmxlYWZsZXQoZGF0YT1kYXRfR1BTLHdpZHRoID0gJzEwMCUnKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtOTMuNTUwODI1LCBsYXQgPSAgNDQuNzIxNjE0LCB6b29tID0gMTEpJT4lDQogIGFkZFRpbGVzKCkgJT4lIA0KICBhZGRNYXJrZXJzKH5Mb25nLH5MYXQsaWNvbj1UcmFmZmljX2NhbWVyYSxsYWJlbCA9IH5UTUMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKQ0KDQoNCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpNZWFuX1RyYXZlbCA8LSBkYXRbIWlzLm5hKGRhdCRUcmF2ZWwuVGltZS4ubWludXRlcy4pLF0gJT4lIA0KICBncm91cF9ieShkYXk9KGZsb29yX2RhdGUobHVicmlkYXRlLCJkYXkiKSkpICU+JQ0KICBzdW1tYXJpc2UoTWVhbj1tZWFuKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1heD1tYXgoKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgTWluPW1pbigoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBTdGQ9c2QoKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgTWVkaWFuPW1lZGlhbigoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSkpICU+JQ0KICBhcnJhbmdlKGRheSkNCk1lYW5fVHJhdmVsJHllYXJfYXZlcmFnZSA8LSBtYShNZWFuX1RyYXZlbCRNZWFuLG9yZGVyPTM2NSkNCmRhdGF0YWJsZShNZWFuX1RyYXZlbCxmaWx0ZXIgPSAndG9wJyxvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoPTcpKSU+JSBmb3JtYXRSb3VuZChjb2xuYW1lcyhNZWFuX1RyYXZlbFssMjo3XSksMyklPiUgZm9ybWF0RGF0ZSgxKQ0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0UsZmlnLmhlaWdodD01LGZpZy53aWR0aD0xMCx3YXJuaW5nPUZBTFNFfQ0KZiA8LSBnZ3Bsb3QoTWVhbl9UcmF2ZWwpKw0KICBnZW9tX2xpbmUoYWVzKGRheSx5ZWFyX2F2ZXJhZ2UpLGNvbG9yPSdyZWQnKSsNCiAgZ2VvbV9saW5lKGFlcyhkYXksTWVhbiksbGluZXR5cGU9ImRhc2hlZCIsc2l6ZT0uNSkrDQogICNnZW9tX2xpbmUoYWVzKGRheSxNZWRpYW4pLGNvbG9yPSdyZWQnKSsNCiAgc2NhbGVfeF9kYXRldGltZShicmVha3MgPSBkYXRlX2JyZWFrcygiMSBtb250aCIpKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTY1LCB2anVzdD0wLjYpKQ0KZ2dwbG90bHkoZikNCg0KDQpgYGANCg0KDQoNCldlIG5vdyB0cmVhdCB0aGUgYXZlcmFnZSB0cmF2ZWwgdGltZSBwZXIgZGF5IGFzIGEgdGltZSBzZXJpZXMuIEJlbG93IGlzIGEgcGxvdCB0aGF0IGlzb2xhdGUgb3V0IHRoZSB0cmVuZCBhbmQgdGhlIHNlYXNvbmFsaXR5IG9mIHRoZSBkYXRhIHNldC4gDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KdHNfVGltZSA9IHRzKE1lYW5fVHJhdmVsJE1lYW4sIGZyZXF1ZW5jeSA9IDM2NSxzdGFydCA9IGMoMjAxNCkpDQpkZWNvbXBvc2VfVGltZSA9IGRlY29tcG9zZSh0c19UaW1lLCAiYWRkaXRpdmUiKQ0KDQojcGxvdChhcy50cyhkZWNvbXBvc2VfVGltZSRzZWFzb25hbCkpDQojcGxvdChhcy50cyhkZWNvbXBvc2VfVGltZSR0cmVuZCkpDQojcGxvdChhcy50cyhkZWNvbXBvc2VfVGltZSRyYW5kb20pKQ0KbXlfcGxvdC5kZWNvbXBvc2VkLnRzKGRlY29tcG9zZV9UaW1lKQ0KdGl0bGUobWFpbiA9ICJDUi00Ml9XZXN0Ym91bmRfMTE4UDA1Mjg0X3RvXzExOFAwNTI4NVxuIE1lYW4gVHJhdmVsIFRpbWUgU2VyaWVzIEFuYWx5c2lzIikNCmBgYA0KDQojIyMgVGFiIDMNCg0KIyMjIyBVUy0xNjlfTm9ydGhib3VuZF8xMThQMDUwNjVfdG9fMTE4UDA1MDY2DQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZ3M9RkFMU0V9DQpkYXQgPC0gVE1DX2RhdGFfbWVyZ2UgJT4lDQogIGZpbHRlcihmaWxlbmFtZSA9PSBwYXN0ZSgnVVMtMTY5X05vcnRoYm91bmRfMTE4UDA1MDY1X3RvXzExOFAwNTA2NicsJy5jc3YnLHNlcD0nJykpDQoNCmRhdF9HUFMxIDwtIG1lbHQoZGF0WzEsXSxtZWFzdXJlLnZhcnM9YygnRnJvbScpLA0KICAgICAgICAgICAgICAgIGlkLnZhcnM9YygnZnJvbV9sYXRpdHVkZScsJ2Zyb21fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KZGF0X0dQUzIgPC0gbWVsdChkYXRbMSxdLG1lYXN1cmUudmFycz1jKCdUbycpLA0KICAgICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCd0b19sYXRpdHVkZScsJ3RvX2xvbmdpdHVkZScpLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KDQpjb2xuYW1lcyhkYXRfR1BTMSkgPC0gYygnTGF0JywnTG9uZycsJ1ZhcmlhYmxlJywnVE1DJykNCmNvbG5hbWVzKGRhdF9HUFMyKSA8LSBjKCdMYXQnLCdMb25nJywnVmFyaWFibGUnLCdUTUMnKQ0KZGF0X0dQUyA8LSBiaW5kX3Jvd3MoZGF0X0dQUzEsZGF0X0dQUzIpDQpkYXRfR1BTJGxhYmVsIDwtIHBhc3RlKGRhdF9HUFMkVmFyaWFibGUsJzonLGRhdF9HUFMkVE1DLHNlcCA9ICcnKQ0KYGBgDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9NH0NCg0KbGVhZmxldChkYXRhPWRhdF9HUFMsd2lkdGggPSAnMTAwJScpICU+JQ0KICBzZXRWaWV3KGxuZyA9IC05My42NzE4NzgsIGxhdCA9ICA0NC42NTgzNDgsIHpvb20gPSAxMSklPiUNCiAgYWRkVGlsZXMoKSAlPiUgDQogIGFkZE1hcmtlcnMofkxvbmcsfkxhdCxpY29uPVRyYWZmaWNfY2FtZXJhLGxhYmVsID0gflRNQykgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJE9wZW5TdHJlZXRNYXApDQoNCg0KYGBgDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KTWVhbl9UcmF2ZWwgPC0gZGF0WyFpcy5uYShkYXQkVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSxdICU+JSANCiAgZ3JvdXBfYnkoZGF5PShmbG9vcl9kYXRlKGx1YnJpZGF0ZSwiZGF5IikpKSAlPiUNCiAgc3VtbWFyaXNlKE1lYW49bWVhbigoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNYXg9bWF4KChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1pbj1taW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgU3RkPXNkKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1lZGlhbj1tZWRpYW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpKSAlPiUNCiAgYXJyYW5nZShkYXkpDQpNZWFuX1RyYXZlbCR5ZWFyX2F2ZXJhZ2UgPC0gbWEoTWVhbl9UcmF2ZWwkTWVhbixvcmRlcj0zNjUpDQpkYXRhdGFibGUoTWVhbl9UcmF2ZWwsZmlsdGVyID0gJ3RvcCcsb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aD03KSklPiUgZm9ybWF0Um91bmQoY29sbmFtZXMoTWVhbl9UcmF2ZWxbLDI6N10pLDMpJT4lIGZvcm1hdERhdGUoMSkNCmBgYA0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEwLHdhcm5pbmc9RkFMU0V9DQpmIDwtIGdncGxvdChNZWFuX1RyYXZlbCkrDQogIGdlb21fbGluZShhZXMoZGF5LHllYXJfYXZlcmFnZSksY29sb3I9J3JlZCcpKw0KICBnZW9tX2xpbmUoYWVzKGRheSxNZWFuKSxsaW5ldHlwZT0iZGFzaGVkIixzaXplPS41KSsNCiAgI2dlb21fbGluZShhZXMoZGF5LE1lZGlhbiksY29sb3I9J3JlZCcpKw0KICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IGRhdGVfYnJlYWtzKCIxIG1vbnRoIikpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NjUsIHZqdXN0PTAuNikpDQpnZ3Bsb3RseShmKQ0KDQoNCmBgYA0KDQoNCg0KV2Ugbm93IHRyZWF0IHRoZSBhdmVyYWdlIHRyYXZlbCB0aW1lIHBlciBkYXkgYXMgYSB0aW1lIHNlcmllcy4gQmVsb3cgaXMgYSBwbG90IHRoYXQgaXNvbGF0ZSBvdXQgdGhlIHRyZW5kIGFuZCB0aGUgc2Vhc29uYWxpdHkgb2YgdGhlIGRhdGEgc2V0LiANCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQp0c19UaW1lID0gdHMoTWVhbl9UcmF2ZWwkTWVhbiwgZnJlcXVlbmN5ID0gMzY1LHN0YXJ0ID0gYygyMDE0KSkNCmRlY29tcG9zZV9UaW1lID0gZGVjb21wb3NlKHRzX1RpbWUsICJhZGRpdGl2ZSIpDQoNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHNlYXNvbmFsKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHRyZW5kKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHJhbmRvbSkpDQpteV9wbG90LmRlY29tcG9zZWQudHMoZGVjb21wb3NlX1RpbWUpDQp0aXRsZShtYWluID0gIlVTLTE2OV9Ob3J0aGJvdW5kXzExOFAwNTA2NV90b18xMThQMDUwNjZcbiBNZWFuIFRyYXZlbCBUaW1lIFNlcmllcyBBbmFseXNpcyIpDQpgYGANCg0KDQoNCg0KIyMjIFRhYiA0DQoNCiMjIyMgVVMtMTY5X1NvdXRoYm91bmRfMTE4TjA1MDcwX3RvXzExOE4wNTA2OQ0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbXlfcGxvdC5kZWNvbXBvc2VkLnRzID0gZnVuY3Rpb24oeCwgdGl0bGU9IiIsIC4uLikgew0KICB4eCA8LSB4JHgNCiAgaWYgKGlzLm51bGwoeHgpKSANCiAgICB4eCA8LSB3aXRoKHgsIGlmICh0eXBlID09ICJhZGRpdGl2ZSIpIA0KICAgICAgcmFuZG9tICsgdHJlbmQgKyBzZWFzb25hbA0KICAgICAgZWxzZSByYW5kb20gKiB0cmVuZCAqIHNlYXNvbmFsKQ0KICBwbG90KGNiaW5kKG9ic2VydmVkID0geHgsIHRyZW5kID0geCR0cmVuZCwgc2Vhc29uYWwgPSB4JHNlYXNvbmFsLCByYW5kb20gPSB4JHJhbmRvbSksIA0KICAgICAgIG1haW49dGl0bGUsIC4uLikNCn0NCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZ3M9RkFMU0V9DQpkYXQgPC0gVE1DX2RhdGFfbWVyZ2UgJT4lDQogIGZpbHRlcihmaWxlbmFtZSA9PSBwYXN0ZSgnVVMtMTY5X1NvdXRoYm91bmRfMTE4TjA1MDcwX3RvXzExOE4wNTA2OScsJy5jc3YnLHNlcD0nJykpDQoNCmRhdF9HUFMxIDwtIG1lbHQoZGF0WzEsXSxtZWFzdXJlLnZhcnM9YygnRnJvbScpLA0KICAgICAgICAgICAgICAgIGlkLnZhcnM9YygnZnJvbV9sYXRpdHVkZScsJ2Zyb21fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KZGF0X0dQUzIgPC0gbWVsdChkYXRbMSxdLG1lYXN1cmUudmFycz1jKCdUbycpLA0KICAgICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCd0b19sYXRpdHVkZScsJ3RvX2xvbmdpdHVkZScpLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KDQpjb2xuYW1lcyhkYXRfR1BTMSkgPC0gYygnTGF0JywnTG9uZycsJ1ZhcmlhYmxlJywnVE1DJykNCmNvbG5hbWVzKGRhdF9HUFMyKSA8LSBjKCdMYXQnLCdMb25nJywnVmFyaWFibGUnLCdUTUMnKQ0KZGF0X0dQUyA8LSBiaW5kX3Jvd3MoZGF0X0dQUzEsZGF0X0dQUzIpDQpkYXRfR1BTJGxhYmVsIDwtIHBhc3RlKGRhdF9HUFMkVmFyaWFibGUsJzonLGRhdF9HUFMkVE1DLHNlcCA9ICcnKQ0KYGBgDQoNCg0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTJ9DQogDQpsZWFmbGV0KGRhdGE9ZGF0X0dQUyx3aWR0aCA9ICcxMDAlJykgJT4lDQogIHNldFZpZXcobG5nID0gLTkzLjU4ODM0NywgbGF0ID0gIDQ0LjczODA0OSwgem9vbSA9IDExKSU+JQ0KICBhZGRUaWxlcygpICU+JSANCiAgYWRkTWFya2Vycyh+TG9uZyx+TGF0LGljb249VHJhZmZpY19jYW1lcmEsbGFiZWwgPSB+VE1DKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkT3BlblN0cmVldE1hcCkNCg0KDQpgYGANCg0KPHByZT4NCg0KDQoNCjwvcHJlPg0KYGBge3IsZWNobz1GQUxTRX0NCk1lYW5fVHJhdmVsIDwtIGRhdFshaXMubmEoZGF0JFRyYXZlbC5UaW1lLi5taW51dGVzLiksXSAlPiUgDQogIGdyb3VwX2J5KGRheT0oZmxvb3JfZGF0ZShsdWJyaWRhdGUsImRheSIpKSkgJT4lDQogIHN1bW1hcmlzZShNZWFuPW1lYW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgTWF4PW1heCgoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNaW49bWluKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIFN0ZD1zZCgoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNZWRpYW49bWVkaWFuKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSkgJT4lDQogIGFycmFuZ2UoZGF5KQ0KTWVhbl9UcmF2ZWwkeWVhcl9hdmVyYWdlIDwtIG1hKE1lYW5fVHJhdmVsJE1lYW4sb3JkZXI9MzY1KQ0KZGF0YXRhYmxlKE1lYW5fVHJhdmVsLGZpbHRlciA9ICd0b3AnLG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGg9NykpJT4lIGZvcm1hdFJvdW5kKGNvbG5hbWVzKE1lYW5fVHJhdmVsWywyOjddKSwzKSU+JSBmb3JtYXREYXRlKDEsbWV0aG9kID0gJ3RvRGF0ZVN0cmluZycpDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEwLHdhcm5pbmc9RkFMU0V9DQpmIDwtIGdncGxvdChNZWFuX1RyYXZlbCkrDQogIGdlb21fbGluZShhZXMoZGF5LHllYXJfYXZlcmFnZSksY29sb3I9J3JlZCcpKw0KICBnZW9tX2xpbmUoYWVzKGRheSxNZWFuKSxsaW5ldHlwZT0iZGFzaGVkIixzaXplPS41KSsNCiAgI2dlb21fbGluZShhZXMoZGF5LE1lZGlhbiksY29sb3I9J3JlZCcpKw0KICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IGRhdGVfYnJlYWtzKCIxIG1vbnRoIikpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NjUsIHZqdXN0PTAuNikpDQpnZ3Bsb3RseShmKQ0KDQoNCmBgYA0KDQoNCg0KV2Ugbm93IHRyZWF0IHRoZSBhdmVyYWdlIHRyYXZlbCB0aW1lIHBlciBkYXkgYXMgYSB0aW1lIHNlcmllcy4gQmVsb3cgaXMgYSBwbG90IHRoYXQgaXNvbGF0ZSBvdXQgdGhlIHRyZW5kIGFuZCB0aGUgc2Vhc29uYWxpdHkgb2YgdGhlIGRhdGEgc2V0LiANCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQp0c19UaW1lID0gdHMoTWVhbl9UcmF2ZWwkTWVhbiwgZnJlcXVlbmN5ID0gMzY1LHN0YXJ0ID0gYygyMDE0KSkNCmRlY29tcG9zZV9UaW1lID0gZGVjb21wb3NlKHRzX1RpbWUsICJhZGRpdGl2ZSIpDQoNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHNlYXNvbmFsKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHRyZW5kKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHJhbmRvbSkpDQpteV9wbG90LmRlY29tcG9zZWQudHMoZGVjb21wb3NlX1RpbWUpDQp0aXRsZShtYWluID0gIlVTLTE2OV9Tb3V0aGJvdW5kXzExOE4wNTA3MF90b18xMThOMDUwNjlcbiBNZWFuIFRyYXZlbCBUaW1lIFNlcmllcyBBbmFseXNpcyIpDQpgYGANCg0KDQoNCg0KDQojIyMgVGFiIDUNCg0KIyMjI1VTLTE2OV9Tb3V0aGJvdW5kXzExOE4wNTA3MV90b18xMThOMDUwNzANCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbXlfcGxvdC5kZWNvbXBvc2VkLnRzID0gZnVuY3Rpb24oeCwgdGl0bGU9IiIsIC4uLikgew0KICB4eCA8LSB4JHgNCiAgaWYgKGlzLm51bGwoeHgpKSANCiAgICB4eCA8LSB3aXRoKHgsIGlmICh0eXBlID09ICJhZGRpdGl2ZSIpIA0KICAgICAgcmFuZG9tICsgdHJlbmQgKyBzZWFzb25hbA0KICAgICAgZWxzZSByYW5kb20gKiB0cmVuZCAqIHNlYXNvbmFsKQ0KICBwbG90KGNiaW5kKG9ic2VydmVkID0geHgsIHRyZW5kID0geCR0cmVuZCwgc2Vhc29uYWwgPSB4JHNlYXNvbmFsLCByYW5kb20gPSB4JHJhbmRvbSksIA0KICAgICAgIG1haW49dGl0bGUsIC4uLikNCn0NCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZ3M9RkFMU0V9DQpkYXQgPC0gVE1DX2RhdGFfbWVyZ2UgJT4lDQogIGZpbHRlcihmaWxlbmFtZSA9PSBwYXN0ZSgnVVMtMTY5X1NvdXRoYm91bmRfMTE4TjA1MDcxX3RvXzExOE4wNTA3MCcsJy5jc3YnLHNlcD0nJykpDQoNCmRhdF9HUFMxIDwtIG1lbHQoZGF0WzEsXSxtZWFzdXJlLnZhcnM9YygnRnJvbScpLA0KICAgICAgICAgICAgICAgIGlkLnZhcnM9YygnZnJvbV9sYXRpdHVkZScsJ2Zyb21fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KZGF0X0dQUzIgPC0gbWVsdChkYXRbMSxdLG1lYXN1cmUudmFycz1jKCdUbycpLA0KICAgICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCd0b19sYXRpdHVkZScsJ3RvX2xvbmdpdHVkZScpLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KDQpjb2xuYW1lcyhkYXRfR1BTMSkgPC0gYygnTGF0JywnTG9uZycsJ1ZhcmlhYmxlJywnVE1DJykNCmNvbG5hbWVzKGRhdF9HUFMyKSA8LSBjKCdMYXQnLCdMb25nJywnVmFyaWFibGUnLCdUTUMnKQ0KZGF0X0dQUyA8LSBiaW5kX3Jvd3MoZGF0X0dQUzEsZGF0X0dQUzIpDQpkYXRfR1BTJGxhYmVsIDwtIHBhc3RlKGRhdF9HUFMkVmFyaWFibGUsJzonLGRhdF9HUFMkVE1DLHNlcCA9ICcnKQ0KYGBgDQoNCg0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTJ9DQogDQpsZWFmbGV0KGRhdGE9ZGF0X0dQUyx3aWR0aCA9ICcxMDAlJykgJT4lDQogIHNldFZpZXcobG5nID0gLTkzLjU4ODM0NywgbGF0ID0gIDQ0LjczODA0OSwgem9vbSA9IDExKSU+JQ0KICBhZGRUaWxlcygpICU+JSANCiAgYWRkTWFya2Vycyh+TG9uZyx+TGF0LGljb249VHJhZmZpY19jYW1lcmEsbGFiZWwgPSB+VE1DKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkT3BlblN0cmVldE1hcCkNCg0KDQpgYGANCg0KPHByZT4NCg0KDQoNCjwvcHJlPg0KYGBge3IsZWNobz1GQUxTRX0NCk1lYW5fVHJhdmVsIDwtIGRhdFshaXMubmEoZGF0JFRyYXZlbC5UaW1lLi5taW51dGVzLiksXSAlPiUgDQogIGdyb3VwX2J5KGRheT0oZmxvb3JfZGF0ZShsdWJyaWRhdGUsImRheSIpKSkgJT4lDQogIHN1bW1hcmlzZShNZWFuPW1lYW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgTWF4PW1heCgoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNaW49bWluKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIFN0ZD1zZCgoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNZWRpYW49bWVkaWFuKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSkgJT4lDQogIGFycmFuZ2UoZGF5KQ0KTWVhbl9UcmF2ZWwkeWVhcl9hdmVyYWdlIDwtIG1hKE1lYW5fVHJhdmVsJE1lYW4sb3JkZXI9MzY1KQ0KZGF0YXRhYmxlKE1lYW5fVHJhdmVsLGZpbHRlciA9ICd0b3AnLG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGg9NykpJT4lIGZvcm1hdFJvdW5kKGNvbG5hbWVzKE1lYW5fVHJhdmVsWywyOjddKSwzKSU+JSBmb3JtYXREYXRlKDEsbWV0aG9kID0gJ3RvRGF0ZVN0cmluZycpDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEwLHdhcm5pbmc9RkFMU0V9DQpmIDwtIGdncGxvdChNZWFuX1RyYXZlbCkrDQogIGdlb21fbGluZShhZXMoZGF5LHllYXJfYXZlcmFnZSksY29sb3I9J3JlZCcpKw0KICBnZW9tX2xpbmUoYWVzKGRheSxNZWFuKSxsaW5ldHlwZT0iZGFzaGVkIixzaXplPS41KSsNCiAgI2dlb21fbGluZShhZXMoZGF5LE1lZGlhbiksY29sb3I9J3JlZCcpKw0KICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IGRhdGVfYnJlYWtzKCIxIG1vbnRoIikpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NjUsIHZqdXN0PTAuNikpDQpnZ3Bsb3RseShmKQ0KDQoNCmBgYA0KDQoNCg0KV2Ugbm93IHRyZWF0IHRoZSBhdmVyYWdlIHRyYXZlbCB0aW1lIHBlciBkYXkgYXMgYSB0aW1lIHNlcmllcy4gQmVsb3cgaXMgYSBwbG90IHRoYXQgaXNvbGF0ZSBvdXQgdGhlIHRyZW5kIGFuZCB0aGUgc2Vhc29uYWxpdHkgb2YgdGhlIGRhdGEgc2V0LiANCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQp0c19UaW1lID0gdHMoTWVhbl9UcmF2ZWwkTWVhbiwgZnJlcXVlbmN5ID0gMzY1LHN0YXJ0ID0gYygyMDE0KSkNCmRlY29tcG9zZV9UaW1lID0gZGVjb21wb3NlKHRzX1RpbWUsICJhZGRpdGl2ZSIpDQoNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHNlYXNvbmFsKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHRyZW5kKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHJhbmRvbSkpDQpteV9wbG90LmRlY29tcG9zZWQudHMoZGVjb21wb3NlX1RpbWUpDQp0aXRsZShtYWluID0gIlVTLTE2OV9Tb3V0aGJvdW5kXzExOE4wNTA3MV90b18xMThOMDUwNzBcbiBNZWFuIFRyYXZlbCBUaW1lIFNlcmllcyBBbmFseXNpcyIpDQpgYGANCg0KDQoNCg0KDQojIyMgVGFiIDYNCg0KIyMjIyBNTi0xM19Ob3J0aGJvdW5kXzExOFAwNTM1MV90b18xMThQMDUzNTINCg0KYGBge3IsZWNobz1GQUxTRX0NCm15X3Bsb3QuZGVjb21wb3NlZC50cyA9IGZ1bmN0aW9uKHgsIHRpdGxlPSIiLCAuLi4pIHsNCiAgeHggPC0geCR4DQogIGlmIChpcy5udWxsKHh4KSkgDQogICAgeHggPC0gd2l0aCh4LCBpZiAodHlwZSA9PSAiYWRkaXRpdmUiKSANCiAgICAgIHJhbmRvbSArIHRyZW5kICsgc2Vhc29uYWwNCiAgICAgIGVsc2UgcmFuZG9tICogdHJlbmQgKiBzZWFzb25hbCkNCiAgcGxvdChjYmluZChvYnNlcnZlZCA9IHh4LCB0cmVuZCA9IHgkdHJlbmQsIHNlYXNvbmFsID0geCRzZWFzb25hbCwgcmFuZG9tID0geCRyYW5kb20pLCANCiAgICAgICBtYWluPXRpdGxlLCAuLi4pDQp9DQpgYGANCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmdzPUZBTFNFfQ0KZGF0IDwtIFRNQ19kYXRhX21lcmdlICU+JQ0KICBmaWx0ZXIoZmlsZW5hbWUgPT0gcGFzdGUoJ01OLTEzX05vcnRoYm91bmRfMTE4UDA1MzUxX3RvXzExOFAwNTM1MicsJy5jc3YnLHNlcD0nJykpDQoNCmRhdF9HUFMxIDwtIG1lbHQoZGF0WzEsXSxtZWFzdXJlLnZhcnM9YygnRnJvbScpLA0KICAgICAgICAgICAgICAgIGlkLnZhcnM9YygnZnJvbV9sYXRpdHVkZScsJ2Zyb21fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KZGF0X0dQUzIgPC0gbWVsdChkYXRbMSxdLG1lYXN1cmUudmFycz1jKCdUbycpLA0KICAgICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCd0b19sYXRpdHVkZScsJ3RvX2xvbmdpdHVkZScpLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICdUTUMnKQ0KDQpjb2xuYW1lcyhkYXRfR1BTMSkgPC0gYygnTGF0JywnTG9uZycsJ1ZhcmlhYmxlJywnVE1DJykNCmNvbG5hbWVzKGRhdF9HUFMyKSA8LSBjKCdMYXQnLCdMb25nJywnVmFyaWFibGUnLCdUTUMnKQ0KZGF0X0dQUyA8LSBiaW5kX3Jvd3MoZGF0X0dQUzEsZGF0X0dQUzIpDQpkYXRfR1BTJGxhYmVsIDwtIHBhc3RlKGRhdF9HUFMkVmFyaWFibGUsJzonLGRhdF9HUFMkVE1DLHNlcCA9ICcnKQ0KYGBgDQoNCg0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTJ9DQogDQpsZWFmbGV0KGRhdGE9ZGF0X0dQUyx3aWR0aCA9ICcxMDAlJykgJT4lDQogIHNldFZpZXcobG5nID0gLTkzLjU4ODM0NywgbGF0ID0gIDQ0LjczODA0OSwgem9vbSA9IDExKSU+JQ0KICBhZGRUaWxlcygpICU+JSANCiAgYWRkTWFya2Vycyh+TG9uZyx+TGF0LGljb249VHJhZmZpY19jYW1lcmEsbGFiZWwgPSB+VE1DKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkT3BlblN0cmVldE1hcCkNCg0KDQpgYGANCg0KPHByZT4NCg0KDQoNCjwvcHJlPg0KYGBge3IsZWNobz1GQUxTRX0NCk1lYW5fVHJhdmVsIDwtIGRhdFshaXMubmEoZGF0JFRyYXZlbC5UaW1lLi5taW51dGVzLiksXSAlPiUgDQogIGdyb3VwX2J5KGRheT0oZmxvb3JfZGF0ZShsdWJyaWRhdGUsImRheSIpKSkgJT4lDQogIHN1bW1hcmlzZShNZWFuPW1lYW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgTWF4PW1heCgoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNaW49bWluKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIFN0ZD1zZCgoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNZWRpYW49bWVkaWFuKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSkgJT4lDQogIGFycmFuZ2UoZGF5KQ0KTWVhbl9UcmF2ZWwkeWVhcl9hdmVyYWdlIDwtIG1hKE1lYW5fVHJhdmVsJE1lYW4sb3JkZXI9MzY1KQ0KZGF0YXRhYmxlKE1lYW5fVHJhdmVsLGZpbHRlciA9ICd0b3AnLG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGg9NykpJT4lIGZvcm1hdFJvdW5kKGNvbG5hbWVzKE1lYW5fVHJhdmVsWywyOjddKSwzKSU+JSBmb3JtYXREYXRlKDEsbWV0aG9kID0gJ3RvRGF0ZVN0cmluZycpDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRSxmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEwLHdhcm5pbmc9RkFMU0V9DQpmIDwtIGdncGxvdChNZWFuX1RyYXZlbCkrDQogIGdlb21fbGluZShhZXMoZGF5LHllYXJfYXZlcmFnZSksY29sb3I9J3JlZCcpKw0KICBnZW9tX2xpbmUoYWVzKGRheSxNZWFuKSxsaW5ldHlwZT0iZGFzaGVkIixzaXplPS41KSsNCiAgI2dlb21fbGluZShhZXMoZGF5LE1lZGlhbiksY29sb3I9J3JlZCcpKw0KICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IGRhdGVfYnJlYWtzKCIxIG1vbnRoIikpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NjUsIHZqdXN0PTAuNikpDQpnZ3Bsb3RseShmKQ0KDQoNCmBgYA0KDQoNCg0KV2Ugbm93IHRyZWF0IHRoZSBhdmVyYWdlIHRyYXZlbCB0aW1lIHBlciBkYXkgYXMgYSB0aW1lIHNlcmllcy4gQmVsb3cgaXMgYSBwbG90IHRoYXQgaXNvbGF0ZSBvdXQgdGhlIHRyZW5kIGFuZCB0aGUgc2Vhc29uYWxpdHkgb2YgdGhlIGRhdGEgc2V0LiANCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQp0c19UaW1lID0gdHMoTWVhbl9UcmF2ZWwkTWVhbiwgZnJlcXVlbmN5ID0gMzY1LHN0YXJ0ID0gYygyMDE0KSkNCmRlY29tcG9zZV9UaW1lID0gZGVjb21wb3NlKHRzX1RpbWUsICJhZGRpdGl2ZSIpDQoNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHNlYXNvbmFsKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHRyZW5kKSkNCiNwbG90KGFzLnRzKGRlY29tcG9zZV9UaW1lJHJhbmRvbSkpDQpteV9wbG90LmRlY29tcG9zZWQudHMoZGVjb21wb3NlX1RpbWUpDQp0aXRsZShtYWluID0gIk1OLTEzX05vcnRoYm91bmRfMTE4UDA1MzUxX3RvXzExOFAwNTM1MlxuIE1lYW4gVHJhdmVsIFRpbWUgU2VyaWVzIEFuYWx5c2lzIikNCmBgYA0KDQoNCg0KDQoNCiMjIyBUYWIgNw0KDQojIyMjIE1OLTQxX1NvdXRoYm91bmRfMTE4TjA1MzgxX3RvXzExOE4wNTM4MA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbXlfcGxvdC5kZWNvbXBvc2VkLnRzID0gZnVuY3Rpb24oeCwgdGl0bGU9IiIsIC4uLikgew0KICB4eCA8LSB4JHgNCiAgaWYgKGlzLm51bGwoeHgpKSANCiAgICB4eCA8LSB3aXRoKHgsIGlmICh0eXBlID09ICJhZGRpdGl2ZSIpIA0KICAgICAgcmFuZG9tICsgdHJlbmQgKyBzZWFzb25hbA0KICAgICAgZWxzZSByYW5kb20gKiB0cmVuZCAqIHNlYXNvbmFsKQ0KICBwbG90KGNiaW5kKG9ic2VydmVkID0geHgsIHRyZW5kID0geCR0cmVuZCwgc2Vhc29uYWwgPSB4JHNlYXNvbmFsLCByYW5kb20gPSB4JHJhbmRvbSksIA0KICAgICAgIG1haW49dGl0bGUsIC4uLikNCn0NCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZ3M9RkFMU0V9DQpkYXQgPC0gVE1DX2RhdGFfbWVyZ2UgJT4lDQogIGZpbHRlcihmaWxlbmFtZSA9PSBwYXN0ZSgnTU4tNDFfU291dGhib3VuZF8xMThOMDUzODFfdG9fMTE4TjA1MzgwJywnLmNzdicsc2VwPScnKSkNCg0KZGF0X0dQUzEgPC0gbWVsdChkYXRbMSxdLG1lYXN1cmUudmFycz1jKCdGcm9tJyksDQogICAgICAgICAgICAgICAgaWQudmFycz1jKCdmcm9tX2xhdGl0dWRlJywnZnJvbV9sb25naXR1ZGUnKSwNCiAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gJ1RNQycpDQpkYXRfR1BTMiA8LSBtZWx0KGRhdFsxLF0sbWVhc3VyZS52YXJzPWMoJ1RvJyksDQogICAgICAgICAgICAgICAgICAgICBpZC52YXJzPWMoJ3RvX2xhdGl0dWRlJywndG9fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gJ1RNQycpDQoNCmNvbG5hbWVzKGRhdF9HUFMxKSA8LSBjKCdMYXQnLCdMb25nJywnVmFyaWFibGUnLCdUTUMnKQ0KY29sbmFtZXMoZGF0X0dQUzIpIDwtIGMoJ0xhdCcsJ0xvbmcnLCdWYXJpYWJsZScsJ1RNQycpDQpkYXRfR1BTIDwtIGJpbmRfcm93cyhkYXRfR1BTMSxkYXRfR1BTMikNCmRhdF9HUFMkbGFiZWwgPC0gcGFzdGUoZGF0X0dQUyRWYXJpYWJsZSwnOicsZGF0X0dQUyRUTUMsc2VwID0gJycpDQpgYGANCg0KDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9Mn0NCiANCmxlYWZsZXQoZGF0YT1kYXRfR1BTLHdpZHRoID0gJzEwMCUnKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtOTMuNTg4MzQ3LCBsYXQgPSAgNDQuNzM4MDQ5LCB6b29tID0gMTEpJT4lDQogIGFkZFRpbGVzKCkgJT4lIA0KICBhZGRNYXJrZXJzKH5Mb25nLH5MYXQsaWNvbj1UcmFmZmljX2NhbWVyYSxsYWJlbCA9IH5UTUMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKQ0KDQoNCmBgYA0KDQo8cHJlPg0KDQoNCg0KPC9wcmU+DQpgYGB7cixlY2hvPUZBTFNFfQ0KTWVhbl9UcmF2ZWwgPC0gZGF0WyFpcy5uYShkYXQkVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSxdICU+JSANCiAgZ3JvdXBfYnkoZGF5PShmbG9vcl9kYXRlKGx1YnJpZGF0ZSwiZGF5IikpKSAlPiUNCiAgc3VtbWFyaXNlKE1lYW49bWVhbigoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNYXg9bWF4KChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1pbj1taW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgU3RkPXNkKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1lZGlhbj1tZWRpYW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpKSAlPiUNCiAgYXJyYW5nZShkYXkpDQpNZWFuX1RyYXZlbCR5ZWFyX2F2ZXJhZ2UgPC0gbWEoTWVhbl9UcmF2ZWwkTWVhbixvcmRlcj0zNjUpDQpkYXRhdGFibGUoTWVhbl9UcmF2ZWwsZmlsdGVyID0gJ3RvcCcsb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aD03KSklPiUgZm9ybWF0Um91bmQoY29sbmFtZXMoTWVhbl9UcmF2ZWxbLDI6N10pLDMpJT4lIGZvcm1hdERhdGUoMSxtZXRob2QgPSAndG9EYXRlU3RyaW5nJykNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MTAsd2FybmluZz1GQUxTRX0NCmYgPC0gZ2dwbG90KE1lYW5fVHJhdmVsKSsNCiAgZ2VvbV9saW5lKGFlcyhkYXkseWVhcl9hdmVyYWdlKSxjb2xvcj0ncmVkJykrDQogIGdlb21fbGluZShhZXMoZGF5LE1lYW4pLGxpbmV0eXBlPSJkYXNoZWQiLHNpemU9LjUpKw0KICAjZ2VvbV9saW5lKGFlcyhkYXksTWVkaWFuKSxjb2xvcj0ncmVkJykrDQogIHNjYWxlX3hfZGF0ZXRpbWUoYnJlYWtzID0gZGF0ZV9icmVha3MoIjEgbW9udGgiKSkrDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT02NSwgdmp1c3Q9MC42KSkNCmdncGxvdGx5KGYpDQoNCg0KYGBgDQoNCg0KDQpXZSBub3cgdHJlYXQgdGhlIGF2ZXJhZ2UgdHJhdmVsIHRpbWUgcGVyIGRheSBhcyBhIHRpbWUgc2VyaWVzLiBCZWxvdyBpcyBhIHBsb3QgdGhhdCBpc29sYXRlIG91dCB0aGUgdHJlbmQgYW5kIHRoZSBzZWFzb25hbGl0eSBvZiB0aGUgZGF0YSBzZXQuIA0KDQoNCg0KYGBge3IsZWNobz1GQUxTRX0NCnRzX1RpbWUgPSB0cyhNZWFuX1RyYXZlbCRNZWFuLCBmcmVxdWVuY3kgPSAzNjUsc3RhcnQgPSBjKDIwMTQpKQ0KZGVjb21wb3NlX1RpbWUgPSBkZWNvbXBvc2UodHNfVGltZSwgImFkZGl0aXZlIikNCg0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkc2Vhc29uYWwpKQ0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkdHJlbmQpKQ0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkcmFuZG9tKSkNCm15X3Bsb3QuZGVjb21wb3NlZC50cyhkZWNvbXBvc2VfVGltZSkNCnRpdGxlKG1haW4gPSAiTU4tNDFfU291dGhib3VuZF8xMThOMDUzODFfdG9fMTE4TjA1MzgwXG4gTWVhbiBUcmF2ZWwgVGltZSBTZXJpZXMgQW5hbHlzaXMiKQ0KYGBgDQoNCg0KDQoNCiMjIyBUYWIgOA0KDQojIyMjIE1OLTQxX05vcnRoYm91bmRfMTE4UDA1MzgwX3RvXzExOFAwNTM4MQ0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbXlfcGxvdC5kZWNvbXBvc2VkLnRzID0gZnVuY3Rpb24oeCwgdGl0bGU9IiIsIC4uLikgew0KICB4eCA8LSB4JHgNCiAgaWYgKGlzLm51bGwoeHgpKSANCiAgICB4eCA8LSB3aXRoKHgsIGlmICh0eXBlID09ICJhZGRpdGl2ZSIpIA0KICAgICAgcmFuZG9tICsgdHJlbmQgKyBzZWFzb25hbA0KICAgICAgZWxzZSByYW5kb20gKiB0cmVuZCAqIHNlYXNvbmFsKQ0KICBwbG90KGNiaW5kKG9ic2VydmVkID0geHgsIHRyZW5kID0geCR0cmVuZCwgc2Vhc29uYWwgPSB4JHNlYXNvbmFsLCByYW5kb20gPSB4JHJhbmRvbSksIA0KICAgICAgIG1haW49dGl0bGUsIC4uLikNCn0NCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZ3M9RkFMU0V9DQpkYXQgPC0gVE1DX2RhdGFfbWVyZ2UgJT4lDQogIGZpbHRlcihmaWxlbmFtZSA9PSBwYXN0ZSgnTU4tNDFfTm9ydGhib3VuZF8xMThQMDUzODBfdG9fMTE4UDA1MzgxJywnLmNzdicsc2VwPScnKSkNCg0KZGF0X0dQUzEgPC0gbWVsdChkYXRbMSxdLG1lYXN1cmUudmFycz1jKCdGcm9tJyksDQogICAgICAgICAgICAgICAgaWQudmFycz1jKCdmcm9tX2xhdGl0dWRlJywnZnJvbV9sb25naXR1ZGUnKSwNCiAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gJ1RNQycpDQpkYXRfR1BTMiA8LSBtZWx0KGRhdFsxLF0sbWVhc3VyZS52YXJzPWMoJ1RvJyksDQogICAgICAgICAgICAgICAgICAgICBpZC52YXJzPWMoJ3RvX2xhdGl0dWRlJywndG9fbG9uZ2l0dWRlJyksDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gJ1RNQycpDQoNCmNvbG5hbWVzKGRhdF9HUFMxKSA8LSBjKCdMYXQnLCdMb25nJywnVmFyaWFibGUnLCdUTUMnKQ0KY29sbmFtZXMoZGF0X0dQUzIpIDwtIGMoJ0xhdCcsJ0xvbmcnLCdWYXJpYWJsZScsJ1RNQycpDQpkYXRfR1BTIDwtIGJpbmRfcm93cyhkYXRfR1BTMSxkYXRfR1BTMikNCmRhdF9HUFMkbGFiZWwgPC0gcGFzdGUoZGF0X0dQUyRWYXJpYWJsZSwnOicsZGF0X0dQUyRUTUMsc2VwID0gJycpDQpgYGANCg0KDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9Mn0NCiANCmxlYWZsZXQoZGF0YT1kYXRfR1BTLHdpZHRoID0gJzEwMCUnKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtOTMuNTg4MzQ3LCBsYXQgPSAgNDQuNzM4MDQ5LCB6b29tID0gMTEpJT4lDQogIGFkZFRpbGVzKCkgJT4lIA0KICBhZGRNYXJrZXJzKH5Mb25nLH5MYXQsaWNvbj1UcmFmZmljX2NhbWVyYSxsYWJlbCA9IH5UTUMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKQ0KDQoNCmBgYA0KDQo8cHJlPg0KDQoNCg0KPC9wcmU+DQpgYGB7cixlY2hvPUZBTFNFfQ0KTWVhbl9UcmF2ZWwgPC0gZGF0WyFpcy5uYShkYXQkVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSxdICU+JSANCiAgZ3JvdXBfYnkoZGF5PShmbG9vcl9kYXRlKGx1YnJpZGF0ZSwiZGF5IikpKSAlPiUNCiAgc3VtbWFyaXNlKE1lYW49bWVhbigoVHJhdmVsLlRpbWUuLm1pbnV0ZXMuKSksDQogICAgICAgICAgICBNYXg9bWF4KChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1pbj1taW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpLA0KICAgICAgICAgICAgU3RkPXNkKChUcmF2ZWwuVGltZS4ubWludXRlcy4pKSwNCiAgICAgICAgICAgIE1lZGlhbj1tZWRpYW4oKFRyYXZlbC5UaW1lLi5taW51dGVzLikpKSAlPiUNCiAgYXJyYW5nZShkYXkpDQpNZWFuX1RyYXZlbCR5ZWFyX2F2ZXJhZ2UgPC0gbWEoTWVhbl9UcmF2ZWwkTWVhbixvcmRlcj0zNjUpDQpkYXRhdGFibGUoTWVhbl9UcmF2ZWwsZmlsdGVyID0gJ3RvcCcsb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aD03KSklPiUgZm9ybWF0Um91bmQoY29sbmFtZXMoTWVhbl9UcmF2ZWxbLDI6N10pLDMpJT4lIGZvcm1hdERhdGUoMSxtZXRob2QgPSAndG9EYXRlU3RyaW5nJykNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MTAsd2FybmluZz1GQUxTRX0NCmYgPC0gZ2dwbG90KE1lYW5fVHJhdmVsKSsNCiAgZ2VvbV9saW5lKGFlcyhkYXkseWVhcl9hdmVyYWdlKSxjb2xvcj0ncmVkJykrDQogIGdlb21fbGluZShhZXMoZGF5LE1lYW4pLGxpbmV0eXBlPSJkYXNoZWQiLHNpemU9LjUpKw0KICAjZ2VvbV9saW5lKGFlcyhkYXksTWVkaWFuKSxjb2xvcj0ncmVkJykrDQogIHNjYWxlX3hfZGF0ZXRpbWUoYnJlYWtzID0gZGF0ZV9icmVha3MoIjEgbW9udGgiKSkrDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT02NSwgdmp1c3Q9MC42KSkNCmdncGxvdGx5KGYpDQoNCg0KYGBgDQoNCg0KDQpXZSBub3cgdHJlYXQgdGhlIGF2ZXJhZ2UgdHJhdmVsIHRpbWUgcGVyIGRheSBhcyBhIHRpbWUgc2VyaWVzLiBCZWxvdyBpcyBhIHBsb3QgdGhhdCBpc29sYXRlIG91dCB0aGUgdHJlbmQgYW5kIHRoZSBzZWFzb25hbGl0eSBvZiB0aGUgZGF0YSBzZXQuIA0KDQoNCg0KYGBge3IsZWNobz1GQUxTRX0NCnRzX1RpbWUgPSB0cyhNZWFuX1RyYXZlbCRNZWFuLCBmcmVxdWVuY3kgPSAzNjUsc3RhcnQgPSBjKDIwMTQpKQ0KZGVjb21wb3NlX1RpbWUgPSBkZWNvbXBvc2UodHNfVGltZSwgImFkZGl0aXZlIikNCg0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkc2Vhc29uYWwpKQ0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkdHJlbmQpKQ0KI3Bsb3QoYXMudHMoZGVjb21wb3NlX1RpbWUkcmFuZG9tKSkNCm15X3Bsb3QuZGVjb21wb3NlZC50cyhkZWNvbXBvc2VfVGltZSkNCnRpdGxlKG1haW4gPSAiTU4tNDFfTm9ydGhib3VuZF8xMThQMDUzODBfdG9fMTE4UDA1MzgxXG4gTWVhbiBUcmF2ZWwgVGltZSBTZXJpZXMgQW5hbHlzaXMiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==